home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / mx / default.mx < prev    next >
Text File  |  1991-05-23  |  13KB  |  458 lines

  1. # default.mx -
  2. #
  3. # This file is an initialization script read by Mx whenever it starts
  4. # up.  It defines a bunch of procedures, configures bindings, and
  5. # initializes variables.
  6. #
  7. # Copyright 1990 Regents of the University of California
  8. # Permission to use, copy, modify, and distribute this
  9. # software and its documentation for any purpose and without
  10. # fee is hereby granted, provided that the above copyright
  11. # notice appear in all copies.  The University of California
  12. # makes no representations about the suitability of this
  13. # software for any purpose.  It is provided "as is" without
  14. # express or implied warranty.
  15.  
  16. # Command procedures to extend the built-in command set:
  17.  
  18. proc move {} {
  19.     set _t [mark caret]
  20.     insert [selection]
  21.     set _l [mark sel.left]
  22.     set _r [mark sel.right]
  23.     selection set $_t [mark caret back 1 char]
  24.     delete $_l $_r noviewchange
  25. }
  26.  
  27. proc line i {
  28.     if {[scan $i %d _t] != 1} {error [format {bad line number "%s"} $i]}
  29.     set _t [format %d.0 $i]
  30.     see $_t
  31.     selection set $_t [mark $_t char -1]
  32.     caret $_t
  33. }
  34.  
  35. proc next {} {
  36.     global files
  37.     if {[length $files] == 1} {error {no more files left to edit}}
  38.     switch [index $files 1]
  39.     set files [range $files 1 end]
  40. }
  41.  
  42. proc tag name {
  43.     global newWindow
  44.     set i [taginfo $name]
  45.     open [index $i 0]
  46.     send $newWindow [list search forw [index $i 1]]
  47. }
  48.  
  49. proc showBindings {args} {
  50.     global newWindow
  51.     open {}
  52.     send $newWindow {insert Keystroke\ Bindings:\n}
  53.     send $newWindow {insert ---------\ --------\n}
  54.     if {[length $args] == 0} {set args [bind]}
  55.     foreach binding $args {
  56.     send $newWindow [list insert [format {\n%-10s => "%s"}
  57.         [control binding $binding] [bind $binding]]]
  58.     }
  59.     send $newWindow clean
  60.     send $newWindow {see 0.0}
  61. }
  62.  
  63. proc showMenus {args} {
  64.     global newWindow
  65.     open {}
  66.     send $newWindow {insert Menu\ information:\n}
  67.     send $newWindow {insert ----\ -----------\n}
  68.     send $newWindow {insert \n(Format:\ displayed\ information\ |\ command)}
  69.     if {[length $args] == 0} {set args [menu info]}
  70.     foreach i $args {
  71.     set leftSize 5
  72.     set midSize 5
  73.     set rightSize 5
  74.     send $newWindow clean
  75.     foreach j [menu info $i] {
  76.         set t [length [index $j 0] chars]
  77.         if {$t > $leftSize} {set leftSize $t}
  78.         set t [length [index $j 1] chars]
  79.         if {$t > $midSize} {set midSize $t}
  80.         set t [length [index $j 2] chars]
  81.         if {$t > $rightSize} {set rightSize $t}
  82.     }
  83.     send $newWindow [list insert [format \n\n%s: $i]]
  84.     foreach j [menu info $i] {
  85.         send $newWindow [list insert [format {\n  %-*s %-*s %-*s | %s} \
  86.             $leftSize [index $j 0] $midSize [index $j 1] \
  87.             $rightSize [index $j 2] [index $j 3]]]
  88.     }
  89.     }
  90.     send $newWindow clean
  91.     send $newWindow {see 0.0}
  92. }
  93.  
  94. proc showProcs {args} {
  95.     global newWindow
  96.     open {}
  97.     send $newWindow {insert Procedure\ information:\n}
  98.     send $newWindow {insert ---------\ -----------}
  99.     if {[length $args] == 0} {set args [info procs]}
  100.     foreach proc $args {
  101.     set space {}
  102.     send $newWindow [list insert [format \n\n%s( $proc]]
  103.     send $newWindow clean
  104.     foreach param [info args $proc] {
  105.         send $newWindow [list insert [format %s%s $space $param]]
  106.         set space {, }
  107.         if [info default $proc $param default] {
  108.         send $newWindow [list insert [format { [%s]} $default]]
  109.         }
  110.     }
  111.     send $newWindow {insert ):\n}
  112.     send $newWindow [list insert [info body $proc]]
  113.     }
  114.     send $newWindow clean
  115.     send $newWindow {see 0.0}
  116. }
  117.  
  118. proc showVars {args} {
  119.     global newWindow
  120.     open {}
  121.     send $newWindow {insert Variable\ values:\n}
  122.     send $newWindow {insert --------\ -------\n}
  123.     set _maxLength 10
  124.     if {[length $args] == 0} {set args [uplevel {info vars}]}
  125.     foreach _i $args {
  126.     if {[length $_i chars] > $_maxLength} {
  127.         set _maxLength [length $_i chars]
  128.     }
  129.     }
  130.     set _maxLength [expr $_maxLength+6]
  131.     foreach _i $args {
  132.     send $newWindow [list insert [format {\n%-*s = "%s"} \
  133.         $_maxLength $_i [uplevel set $_i]]]
  134.     }
  135.     send $newWindow clean
  136.     send $newWindow {see 0.0}
  137. }
  138.  
  139. proc where {} {
  140.     global newWindow errorInfo
  141.  
  142.     if {![info exists errorInfo]} {
  143.     return "no error has occurred yet"
  144.     }
  145.     open {}
  146.     send $newWindow {insert "Stack trace for last error:\n"}
  147.     send $newWindow {insert "----- ----- --- ---- ------\n\n"}
  148.     send $newWindow [list insert $errorInfo]
  149.     send $newWindow "clean; see 0.0"
  150. }
  151.  
  152. proc caretinfo {} {
  153.     global file
  154.     scan [mark eof] %d _t
  155.     scan [mark caret] %d _t2
  156.     return [format {"%s": %d total lines, caret on line %d} $file $_t $_t2]
  157. }
  158.  
  159. # Copying and deletion bindings:
  160.  
  161. bind \Cv {insert [selection]}
  162. bind \Mv {move}
  163. bind \Cd {delete sel.left sel.right}
  164. bind \ed {
  165.     set saved [selection]
  166.     delete sel.left sel.right
  167. }
  168. bind \ev {insert $saved}
  169. bind \Ch {!delete [mark caret back 1 char]}
  170. bind \177 {!delete [mark caret back 1 char]}
  171. bind \Cl {delete caret}
  172. bind \Cw {!delete [mark caret back 1 word] [mark caret back 1 char]}
  173. bind \Cn {delete caret [mark [mark caret forw 1 word] back 1 char]}
  174. bind \Ce {
  175.     if {[string compare [mark caret] [mark caret char -1]] != 0} {
  176.     delete caret [mark [mark caret char -1] back 1 char]
  177.     } else {
  178.     delete [mark caret]}
  179. }
  180.  
  181. # Non-destructive caret motion bindings:
  182.  
  183. bind \Mh {
  184.     caret [mark caret back 1 char]
  185.     see caret
  186. }
  187. set _lastPos 0.0
  188. bind \Mj {
  189.     if {[string compare $_lastPos [mark caret]] != 0} {
  190.         set _lastCol [column caret]
  191.     }
  192.     set _lastPos [mark [mark caret forw 1 line] column $_lastCol]
  193.     caret $_lastPos
  194.     see caret
  195. }
  196. bind \Mk {
  197.     if {[string compare $_lastPos [mark caret]] != 0} {
  198.     set _lastCol [column caret]
  199.     }
  200.     set _lastPos [mark [mark caret back 1 line] column $_lastCol]
  201.     caret $_lastPos
  202.     see caret
  203. }
  204. bind \Ml {
  205.     caret [mark caret forw 1 char]
  206.     see caret
  207. }
  208. bind \Mw {
  209.     caret [mark caret back 1 word]
  210.     see caret
  211. }
  212. bind \Mn {
  213.     caret [mark caret forw 1 word]
  214.     see caret
  215. }
  216. bind \Me {
  217.     set _t [mark caret char -1]
  218.     if {[string compare [mark caret] $_t] == 0} {
  219.     set _t [mark [mark caret forw 1 line] char -1]
  220.     }
  221.     caret $_t
  222.     see caret
  223. }
  224. bind \215 {
  225.     caret [mark [mark caret forw 1 line] char 0]
  226.     see caret
  227. }
  228. bind \Cg {history next history {line [selection]}}
  229.  
  230. # Searching and replacement bindings:
  231.  
  232. bind \Cf {history next history {search forw}}
  233. bind \Cb {history next history {search back}}
  234. bind \Mf {history next history {search forw [selection]}}
  235. bind \Mb {history next history {search back [selection]}}
  236. bind \e\Cf {history next history {
  237.     set _l [mark sel.left]
  238.     set _r [mark sel.right]
  239.     selection set caret
  240.     search forw
  241.     selection set $_l $_r
  242. }}
  243. bind \e\Cb {history next history {
  244.     set _l [mark sel.left]
  245.     set _r [mark sel.right]
  246.     selection set caret
  247.     search back
  248.     selection set $_l $_r
  249. }}
  250. bind \ef {history ignore {focus search clear}}
  251. bind \er {history ignore {focus replace clear}}
  252. bind \Cr {replace}
  253.  
  254. # Indentation bindings:
  255.  
  256. bind \Cp {indent caret caret + 4}
  257. bind \Cy {indent caret caret - 4}
  258. bind \Mp {indent sel.left sel.right + 4}
  259. bind \My {indent sel.left sel.right - 4}
  260.  
  261. # File and tag bindings:
  262.  
  263. bind \Co {
  264.     open $file
  265.     send $newWindow [list see [mark top] top]
  266. }
  267. bind \Mo {open [selection]}
  268. bind \Ms {switch [selection]}
  269. bind \Ct {
  270.     set _t [taginfo [selection]]
  271.     switch [index $_t 0]
  272.     search forw [index $_t 1]
  273. }
  274. bind \Mt {tag [selection]}
  275. bind \et {
  276.     set _t [mark caret back 1 char]
  277.     selection set [mark $_t back 1 word] $_t
  278.     tag [selection]
  279. }
  280.  
  281. # Mark-related bindings:
  282.  
  283. bind \ema {set _marka [mark caret]}
  284. bind \Mma {see $_marka; caret $_marka}
  285. bind \emb {set _markb [mark caret]}
  286. bind \Mmb {see $_markb; caret $_markb}
  287. bind \emc {set _markc [mark caret]}
  288. bind \Mmc {see $_markc; caret $_markc}
  289. bind \emd {set _markd [mark caret]}
  290. bind \Mmd {see $_markd; caret $_markd}
  291. bind \eme {set _marke [mark caret]}
  292. bind \Mme {see $_marke; caret $_marke}
  293. bind \emf {set _markf [mark caret]}
  294. bind \Mmf {see $_markf; caret $_markf}
  295. bind \emg {set _markg [mark caret]}
  296. bind \Mmg {see $_markg; caret $_markg}
  297. bind \emh {set _markh [mark caret]}
  298. bind \Mmh {see $_markh; caret $_markh}
  299. bind \emi {set _marki [mark caret]}
  300. bind \Mmi {see $_marki; caret $_marki}
  301. bind \emj {set _markj [mark caret]}
  302. bind \Mmj {see $_markj; caret $_markj}
  303. bind \emk {set _markk [mark caret]}
  304. bind \Mmk {see $_markk; caret $_markk}
  305. bind \eml {set _markl [mark caret]}
  306. bind \Mml {see $_markl; caret $_markl}
  307. bind \emm {set _markm [mark caret]}
  308. bind \Mmm {see $_markm; caret $_markm}
  309. bind \emn {set _markn [mark caret]}
  310. bind \Mmn {see $_markn; caret $_markn}
  311. bind \emo {set _marko [mark caret]}
  312. bind \Mmo {see $_marko; caret $_marko}
  313. bind \emp {set _markp [mark caret]}
  314. bind \Mmp {see $_markp; caret $_markp}
  315. bind \emq {set _markq [mark caret]}
  316. bind \Mmq {see $_markq; caret $_markq}
  317. bind \emr {set _markr [mark caret]}
  318. bind \Mmr {see $_markr; caret $_markr}
  319. bind \ems {set _marks [mark caret]}
  320. bind \Mms {see $_marks; caret $_marks}
  321. bind \emt {set _markt [mark caret]}
  322. bind \Mmt {see $_markt; caret $_markt}
  323. bind \emu {set _marku [mark caret]}
  324. bind \Mmu {see $_marku; caret $_marku}
  325. bind \emv {set _markv [mark caret]}
  326. bind \Mmv {see $_markv; caret $_markv}
  327. bind \emw {set _markw [mark caret]}
  328. bind \Mmw {see $_markw; caret $_markw}
  329. bind \emx {set _markx [mark caret]}
  330. bind \Mmx {see $_markx; caret $_markx}
  331. bind \emy {set _marky [mark caret]}
  332. bind \Mmy {see $_marky; caret $_marky}
  333. bind \emz {set _markz [mark caret]}
  334. bind \Mmz {see $_markz; caret $_markz}
  335.  
  336. # Miscellaneous bindings:
  337.  
  338. bind \Cq {quit}
  339. bind \Cu {history next history {undo more}}
  340. bind \Cs {write}
  341. bind \t {!insert \t}
  342. bind \15 {newline}
  343. bind \Cj {
  344.     caret [mark caret char -1]
  345.     newline
  346. }
  347. bind \Ck {
  348.     insert \n [mark caret char 0]
  349.     caret [mark [mark caret char 0] back 1 char]
  350. }
  351. bind \Ca {
  352.     history add $history
  353.     history ignore {eval $history}
  354. }
  355. bind \Cc {history ignore {focus command clear}}
  356. bind \C? caretinfo
  357.  
  358. # Menus:
  359.  
  360. menu create Control \
  361.     {Save and quit} - - - {write; quit} \
  362.     {Save} - {C-s} - {write} \
  363.     {Save in file $sel} - - - {write [selection]} \
  364.     {Undo} - {C-u} - {history next history {undo more}} \
  365.     {Do again} - {C-a} - {
  366.     history add $history
  367.     history ignore {eval $history}
  368.     } \
  369.     {Reset} - - - reset \
  370.     {Quit} - {C-q} - quit
  371. menu create Help \
  372.     {Introductory tutorial} - - - {open [format %s/tutorial1 $helpDir]} \
  373.     {Info on last error} - - - {where} \
  374.     {Info on default key bindings} - - - {
  375.     open [format %s/bindings.doc $helpDir]
  376.     } \
  377.     {Current key bindings} - - - {showBindings} \
  378.     {Current variable values} - - - {showVars} \
  379.     {Current menus} - - - {showMenus} \
  380.     {Current command procedures} - - - {showProcs}
  381. menu create Search \
  382.     {Search forward} - {C-f} - {history next history {search forw}} \
  383.     {Search backward} - {C-b} - {history next history {search back}} \
  384.     {Search forward for $sel} - {M-f} - \
  385.     {history next history {search forw [selection]}} \
  386.     {Search backward for $sel} - {M-b} - \
  387.     {history next history {search back [selection]}} \
  388.     {Replace} - {C-r} - {replace} \
  389.     {Substitute throughout $sel} - - - {
  390.     replace range sel.left sel.right
  391.     focus file
  392.     } \
  393.     {Substitute everywhere} - - - {replace range 0.0 eof; focus file}
  394. menu create Window \
  395.     {See tag $sel} - {C-t} - {
  396.     set _t [taginfo [selection]]
  397.     switch [index $_t 0]
  398.     search forw [index $_t 1]
  399.     } \
  400.     {See file $sel} - {M-s} - {switch [selection]} \
  401.     {See line $sel} - {C-g} - {
  402.     history next history {
  403.         if {[scan [selection] %d _t] != 1} {error
  404.             {you didn't select a line number}}
  405.         line $_t
  406.     }
  407.     } \
  408.     {New window on tag $sel} - {M-t} - {tag [selection]} \
  409.     {New window on file $sel} - {M-o} - {open [selection]} \
  410.     {New window on same file} - {C-o} - {
  411.     open $file
  412.     send $newWindow [list see [mark top] top]
  413.     } \
  414.     {Open command subwindow} - {C-c} - {history ignore {focus command clear}}
  415. menu create Indent \
  416.     {Indent selected lines 4} - {M-p} - {indent sel.left sel.right + 4} \
  417.     {Outdent selected lines 4} - {M-y} - {indent sel.left sel.right - 4} \
  418.     {Indent caret line 4} - {C-p} - {indent caret caret + 4} \
  419.     {Outdent caret line 4} - {C-y} - {indent caret caret - 4} \
  420.     {Left-justify selected lines} - - - {indent sel.left sel.right 0}
  421. menu create Selection \
  422.     {Copy $sel to caret} - {C-v} - {insert [selection]} \
  423.     {Move $sel to caret} - {M-v} - {move} \
  424.     {Delete $sel} - {C-d} - {delete sel.left sel.right}
  425. menu create Misc \
  426.     {Caret location} - {C-?} - {caretinfo} \
  427.     {Convert to control characters} - - - {
  428.     set _t [extract sel.left sel.right]
  429.     set _t2 [mark sel.left]
  430.     insert [control make $_t] $_t2
  431.     set _t3 [mark sel.left back 1 char]
  432.     delete sel.left sel.right
  433.     selection set $_t2 $_t3
  434.     } \
  435.     {Insert file $sel at caret} - - - {read [selection]}
  436.  
  437. if [file /sprite/lib/forms isdirectory] {
  438.     menu create Forms \
  439.     local.mk - - - {read /sprite/lib/forms/local.mk} \
  440.     prochead - - - {read /sprite/lib/forms/prochead} \
  441.     proto.c - - - {read /sprite/lib/forms/proto.c} \
  442.     proto.csh - - - {read /sprite/lib/forms/proto.csh} \
  443.     proto.h - - - {read /sprite/lib/forms/proto.h} \
  444.     cmd.man - - - {read /sprite/lib/forms/cmd.man} \
  445.     lib.man - - - {read /sprite/lib/forms/lib.man} \
  446.     sun3.md/proto.s - - - {read /sprite/lib/forms/sun3.md/proto.s} \
  447.     sun3.md/asmhead - - - {read /sprite/lib/forms/sun3.md/asmhead}
  448. }
  449.  
  450. # Various controlling variables:
  451.  
  452. set searchCmd {history next history search}
  453. set replaceCmd replace
  454.  
  455. # Miscellaneous variables:
  456.  
  457. set history {}
  458.